//
//  WLRRouteRequest.h
//  Pods
//
//  Created by Neo on 2016/12/15.
//
//

#import <Foundation/Foundation.h>


//WLRRouteRequest是一个以URL为基础的实体对象，为什么不直接用URL字符串？
//因为考虑到如果路由在内部调用其他模块的时候需要传入一些原生对象，而URL上只能携带类型单一的字符串键值对表示参数，所以需要使用这么一个对象进行包装。
typedef void(^WLRRouteCompletionHandler)(NSError *error,NSDictionary * responseObject);


@interface WLRRouteRequest : NSObject<NSCopying>
/**
 WLRRouteRequest设计
 
 路由层的请求，无论是跨应用的外部调用(H5调用、其他App调用)还是内部调用(内部模块相互调用)，最后都要形成一个路由请求，
 一个以URL为基础的request对象，首先需要有携带URL，
 再一个要携带请求所需要的参数，参数有三种，
 一种是Url上的              键值对参数，
 一种是RESTFul风格的Url上的  路径参数，
 一种是内部调用适用的         原生参数
 
 */


//外部调用的URL
@property (nonatomic, copy, readonly) NSURL *URL;
//URL表达式，比方说调用登录界面的表达式可以为：AppScheme://user/login/138********，那URL的匹配表达式可以是：/login/:phone([0-9]+),路径必须以/login开头，后面接0-9的电话号码数字，当然你也可以直接把电话号码的正则匹配写全
@property(nonatomic,copy)NSString * routeExpression;
//如果URL是AppScheme://user/login/138********?callBack="",那么这个callBack就出现在这

//url上？以后的键值对参数
@property (nonatomic, copy, readonly) NSDictionary *queryParameters;
//url上匹配的路径参数
//这里面会出现{@"phone":@"138********"}
@property (nonatomic, copy, readonly) NSDictionary *routeParameters;
//原生参数，比方说要传给目标UIImage对象，NSArray对象等等
//这里面存放的是内部调用传递的原生参数
@property (nonatomic, copy, readonly) NSDictionary *primitiveParams;
//目标预留的callBack block,当完成处理以后,回到此Block，完成调用者的回调
//自动检测窃取回调的callBack 的Url
@property (nonatomic, strong) NSURL *callbackURL;
 

//目标的viewcontrolller或者是组件可以通过这个
@property(nonatomic,copy) WLRRouteCompletionHandler targetCallBack;
//是否消费掉，一个request只能处理一次，该字段反应request是否被处理过
//用以表明该request是否被消费
@property(nonatomic) BOOL isConsumed;


//简便方法，用以下标法取参数
- (id)objectForKeyedSubscript:(NSString *)key;
//初始化方法
-(instancetype)initWithURL:(NSURL *)URL;

-(instancetype)initWithURL:(NSURL *)URL routeExpression:(NSString *)routeExpression routeParameters:(NSDictionary *)routeParameters primitiveParameters:(NSDictionary *)primitiveParameters targetCallBack:(void(^)(NSError * error,id responseObject))targetCallBack;
//默认完成目标的回调
-(void)defaultFinishTargetCallBack;
@end
